package city.spring.modules.checkinfeeDetail.repository;

import city.spring.modules.checkinfeeDetail.entity.CheckinfeeDetailEntity;
import city.spring.modules.checkinfeeDetail.vo.CheckinfeeDetailVO;
import city.spring.modules.oldman.vo.OldmanDepositVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;

/**
 * 存储库：入院收费记录
 *
 * @author 谢金婷
 * @date 2020-08-24 15:46:11
 */
@Repository
public interface CheckinfeeDetailRepository extends BaseMapper<CheckinfeeDetailEntity> {
    IPage<CheckinfeeDetailVO> listPage(Page<? extends CheckinfeeDetailEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends CheckinfeeDetailEntity> wrapper);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的入院固定费用
     *
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getFixedcostsByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的押金
     *
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getDepositByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的入住月收费用类别
     *
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getMfeeByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 计算入院收费本月应收费用总和
     *
     * @param checkinfeeId
     * @param oldmanId
     * @param mark
     * @return
     */
    BigDecimal getSumReceivablethisMonth(String checkinfeeId, String oldmanId, String mark);


    /**
     * 月度缴费 获取应缴费用信息 （床位、护理、餐饮、水电、定制护理费）
     */
    List<CheckinfeeDetailVO> monthPayInfo(String checkfeeid);

    /**
     * 月度缴费 获取应缴费用信息 （床位、护理、餐饮、水电、定制护理费）
     */
    CheckinfeeDetailVO monthPayInfoOne(String checkfeeid, Integer typenum);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的餐饮费
     *
     * @param checkinfeeId
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getDiningfeeByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的水电费
     *
     * @param checkinfeeId
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getUtilitybillByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id查找老人入院缴费明细
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailEntity> getCheckinfeeDetailByOldmanId(String oldmanId);

    /**
     * 根据老人id获取该老人的入院收费的餐饮费
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailVO> getDiningfeeByOldmanId(@Param("oldmanId") String oldmanId);

    /**
     * 根据老人id获取该老人的入院收费的水电费
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailVO> getUtilitybillByOldmanId(@Param("oldmanId") String oldmanId);

    /**
     * 根据老人id获取该老人的入院收费的押金
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailVO> getDepositByOldmanId(@Param("oldmanId") String oldmanId);

    /**
     * 根据老人id获取该老人的入院收费的其他费用
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailVO> getFixedcostsByOldmanId(@Param("oldmanId") String oldmanId);

    /**
     * 根据checkinfeeId 查找缴费明细
     *
     * @param checkinfeeId
     * @return
     */
    List<CheckinfeeDetailEntity> getCheckinfeeDetailByCheckinfeeId(String checkinfeeId);

    List<CheckinfeeDetailEntity> getConsumptionItemsByOldmanId(String oldmanId);

    /**
     * 查找入院缴费的餐饮费
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getDiningfee(@Param("oldmanId") String oldmanId);

    /**
     * 查找入院缴费的水电费
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getUtilitybill(@Param("oldmanId") String oldmanId);

    /**
     * 查找入院缴费的押金
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getDeposit(String oldmanId);

    /**
     * 查找入院缴费的追加月费用记录
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailEntity> getMonthlyfee(String oldmanId);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的追加月费用
     *
     * @param checkinfeeId
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getMonthlyfeeByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id获取该老人的入院收费的追加月费用
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailEntity> getMonthlyfeeByOldmanId(String oldmanId);


    /**
     * 查找入院缴费的护理级别费用
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getAttendance(@Param("oldmanId") String oldmanId);

    /**
     * 查找入院缴费的定制护理费
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getPrivatecustomizationFee(@Param("oldmanId") String oldmanId);

    /**
     * 查找入院缴费的床位费用
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getBed(@Param("oldmanId") String oldmanId);

    /**
     * 查询所有的押金
     *
     * @return
     */
    IPage<OldmanDepositVO> oldmanDepositListPage(Page<? extends CheckinfeeDetailEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends CheckinfeeDetailEntity> wrapper);

    /**
     * 获取月度缴费明细
     *
     * @param feeid
     * @return
     */
    List<CheckinfeeDetailVO> monthPayDetail(String feeid);

    /**
     * 获取押金及预存余额
     *
     * @param personId
     * @return
     */
    CheckinfeeDetailVO getDepositAndBalance(String personId);

    /**
     * 退住结算：账单情况：罗列截至退住日期的需要交费的应付账单(退住日期不是月末最后一天，如12月31日)
     *
     * @param personId
     * @param leaveMonth
     * @return
     */
    List<CheckinfeeDetailVO> billToLeaveDateByMonthMid(String personId, int leaveMonth);

    /**
     * 退住结算：账单情况：罗列截至退住日期的需要交费的应付账单(退住日期是月末最后一天，如12月15日)
     *
     * @param personId
     * @param leaveMonth
     * @return
     */
    List<CheckinfeeDetailVO> billToLeaveDateByMonthEnd(String personId, int leaveMonth);
}